Checkpoint-Gruppe – Die Fahrkarten bitte!
Heute stand ich vor der Frage, wie man im Programm eine Abfrage einbaut, die man in jedem System ohne extra Parametertabelle oder ähnlichem an- oder ausschalten kann. Normalerweise gibt es dafür Parameter-Tabellen oder man könnte auch Benutzerparameter verwenden. Ersteres war jedoch zu aufwändig und die zweite Variante passte nicht, da für beliebige Benutzer (auch RFC-User) gesteuert werden sollte, ob eine Protokollierung statt findet oder nicht.
Da ich für die Protokollierung einiger Aktionen bereits die Checkpoint-Gruppen verwendet habe, kam ich auf die Idee, diese abzufragen. Eigentlich funktioniert der Befehl LOG-POINT anders: Die Anweisung wird eingebaut und wenn in der Transaktion SAAB die Protokollierung zum aktuellen Zeitpunkt aktiviert wurde, dann wird das Protokoll geschrieben:
LOG ID ztricktresor SUBKEY 'CHECK1' FIELDS subrc.
Transaktion SAAB
In der Transaktion Checkpoint-Gruppe ändern SAAB kannst du einstellen, wie sich die einzelnen Befehle LOG-POINT, ASSERT, BREAK-POINT verhalten sollen.
Andersherum wird ein Schuh draus
Die Aktivierungsdaten werden in die Tabelle AAB_ID_ACT geschrieben. Zusätzlich wird gespeichert, wann die Aktivierung abläuft und welche Kontrollpunkte aktiv sind (Breakpoints, Logpoints, Assertions). Diese Tabelle lese ich aus, um zu prüfen, ob das Logging zu einer Checkpoint-Gruppe aktiv ist.
Welche Kontrollpunkte aktiv sind, wird im Feld ACTMODE bitweise gespeichert. Die Bits haben dabei folgende Bedeutung:
Bit 1 | Bit 2 | Bit 3 | Bit 4 | Bit 5 | Bit 6 | Bit 7 | Bit 8 |
ohne Funktion | Logging | Assertions Hintergrund abbrechen | Assertions Hintergrund protokollieren | Assertions abbrechen | Assertions protokollieren | Assertions anhalten | Breakpoints |
Mithilfe des Befehls GET BIT 2 OF ACTMODE bekomme ich heraus, ob das Logging eingeschaltet ist.
Der Wert ist dann 64, Du kannst die Konstante CL_ABAP_AAB_UTILITIES=>BITMASK_LOGPOINT verwenden.
Globale Checkpoint-Aktivierungen
In der Transaktion SAAB legt man in der Regel die Einstellungen für sich selbst an. Du kannst jedoch über Alle Aktivierungen [_Benutzer_] auch globale Einstellungen vornehmen. Diese sind dann für alle Benutzer gültig. Das Feld AAB_ID_ACT-USERNAME ist in dem Fall initial.
Ebenso kann eine Einschränkung auf Server vorgenommen werden. Ist das der Fall, dann steht im Feld AAB_ID_ACT-SERVER der Name des Applicationservers.
Coding
REPORT zz_checkpoint. CLASS lcl_saab DEFINITION. PUBLIC SECTION. CLASS-METHODS check_active IMPORTING name TYPE clike user TYPE clike OPTIONAL RETURNING VALUE(active) TYPE boolean. ENDCLASS. CLASS lcl_saab IMPLEMENTATION. METHOD check_active. *== local data DATA ls_aabact TYPE aab_id_act. DATA lv_tstamp TYPE timestamp. DATA lv_actmode TYPE x. active = abap_false. *== check checkpoint SELECT SINGLE * FROM aab_id_act INTO ls_aabact WHERE name = name AND username = user. IF sy-subrc = 0. *== Checkpoint active GET TIME STAMP FIELD lv_tstamp. IF lv_tstamp <= ls_aabact-exp_tstamp. *== checkpoint is valid at the moment lv_actmode = ls_aabact-actmode. *== check if logging is active GET BIT 2 OF lv_actmode INTO DATA(lv_logging). IF lv_logging = 1. *== yes, active active = abap_true. ENDIF. ENDIF. ENDIF. ENDMETHOD. ENDCLASS. PARAMETERS p_name TYPE progname DEFAULT 'ZTRICKTRESOR'. START-OF-SELECTION. IF lcl_saab=>check_active( p_name ) = abap_true. MESSAGE i000(oo) WITH 'Checkpoint-Gruppe' p_name ' Logging ist aktiv'. ELSE. MESSAGE i000(oo) WITH 'Checkpoint-Gruppe' p_name 'Logging ist NICHT aktiv'. ENDIF.
Update
In der Zwischenzeit habe ich die Klasse CL_ABAP_AAB_UTILITIES gefunden mit der du die Aktivierung einfach prüfen kannst:
DATA(logpoint_active) = cl_abap_aab_utilities=>is_active(
EXPORTING
id = 'ZTRICKTRESOR'
mode_logpoint = abap_true ).
- Interview mit Björn Schulz (Software-Heroes.com) - 3. September 2024
- Daten aus ALV ermitteln - 3. September 2024
- So lange es den SAPGUI noch gibt… - 27. Juni 2024
Hallo Enno,
nicht schlecht! Ich habe nur einen Hinweis. Der Parameter Name ist optional. Daher sollte der SQL so aussehen:
*== check checkpoint
IF NOT user IS INITIAL.
SELECT SINGLE * FROM aab_id_act INTO ls_aabact
WHERE name = name
AND username = user.
ELSE.
SELECT SINGLE * FROM aab_id_act INTO ls_aabact
WHERE name = name.
ENDIF.